package qc.module.weixin.miniapp.controller;

import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
import cn.binarywang.wx.miniapp.util.WxMaConfigHolder;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.bind.annotation.*;
import qc.module.weixin.miniapp.utils.JsonUtils;

/**
 * 微信小程序用户接口
 *
 * @author QuCheng Tech
 * @create 2023/2/10
 */
@RestController
@AllArgsConstructor
@Slf4j
@RequestMapping("/user/{appid}")
public class WxMaUserController {
    private final WxMaService wxMaService;

    /**
     * 登陆接口，用jscode换取sessionKey
     */
    @GetMapping("/login")
    public String login(@PathVariable String appid, String code) {
        if (StringUtils.isBlank(code)) {
            return "empty jscode";
        }

        if (!wxMaService.switchover(appid)) {
            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置，请核实！", appid));
        }

        try {
            WxMaJscode2SessionResult session = wxMaService.getUserService().getSessionInfo(code);
            log.info(session.getSessionKey());
            log.info(session.getOpenid());
            //TODO 可以增加自己的逻辑，关联业务相关数据
            return JsonUtils.toJson(session);
        } catch (WxErrorException e) {
            log.error(e.getMessage(), e);
            return e.toString();
        } finally {
            WxMaConfigHolder.remove();//清理ThreadLocal
        }
    }

    /**
     * 根据code换取用户手机号
     *
     * @param appid 小程序的appid
     * @param code  前端onGetPhoneNumber得到的e.detail.code
     * @return 用户手机号信息json
     * @author QuCheng Tech
     * @date 2023/2/10
     */
    @GetMapping("/phone")
    public String phone(@PathVariable String appid, @RequestParam String code) throws WxErrorException {
        WxMaPhoneNumberInfo phoneNoInfo = null;
        try {
            if (!wxMaService.switchover(appid)) {
                throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置，请核实！", appid));
            }
            
            //根据小程序服务端接口getPhoneNumber，该接口用于将 code 换取用户手机号。 说明，每个 code 只能使用一次，code的有效期为5min。
            phoneNoInfo = wxMaService.getUserService().getNewPhoneNoInfo(code);
        }catch (Exception e){
            return e.getMessage();
        }

        WxMaConfigHolder.remove();//清理ThreadLocal
        return JsonUtils.toJson(phoneNoInfo);
    }
}
